package com.example.thread.d9CompletableFuture2.d5合并多个异步任务allOf和anyOf;
// 使用thenCompose（）和他很Combine（）将两个CompletableFuture组合和合并在一起
// 如果编排任意数量的CompletableFutute怎么办？可以使用以下方法来组合任意数量的CompletableFutute

import com.example.thread.d9CompletableFuture2.CommonUtils;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;

/**
 * public static CompletableFuture<void> allOf(CompletableFuture<?>... cfs)
 * public static CompletableFuture<Object> allOf(CompletableFuture<?>... cfs)
 * CompletableFutute.allOf()用于，有多个需要独立并运行的Future，并在所有这些Future都完成后执行一些操作
 */
public class d1_AllOfDemo {

    public static CompletableFuture<String> readFileFuture(String content) {
        return CompletableFuture.supplyAsync(()-> {
            String file = CommonUtils.readFile(content);
            return file;
        });
    }

    public static void main(String[] args) {
        // 创建list集合存储数据
        List<String> list = Arrays.asList("hel5lo","hello world","hello good");

        List<CompletableFuture<String>> futures = list.stream().map(item -> {
            return readFileFuture(item);
        }).collect(Collectors.toList());
        // list转换为数组
        int len = futures.size();
        CompletableFuture[] completableFutures = futures.toArray(new CompletableFuture[len]);

        // 使用allOf方法合并多个异步任务
        CompletableFuture<Void> future = CompletableFuture.allOf(completableFutures);

        for (CompletableFuture completableFuture : completableFutures) {
            System.out.println(completableFuture.join());
        }

        // 统计
        CompletableFuture<Long> count = future.thenApply(v -> {
            return futures.stream().map(futureData -> futureData.join())
                    .filter(content -> content.contains("hello")).count();
        });

        Long join = count.join();
        System.out.println(join);
        /**
         * allOf 特别适合合并多个异步任务，当所有异步任务都完成时，可以进一步操作
         */
    }
}
